package com.atguigu03.threadsafe.threadsafe;

/**
 * ClassName: PersonTest
 * Description:
 * 使用继承Thread类的方式，实现卖票
 *  使用代码块的方式解决线程安全问题。
 * @Author liu
 * @Create 2024/11/15 23:28
 * @Version 1.0
 */
class Window extends Thread{
    static int ticket = 100;
    // 使用同步代码块的方式解决线程安全问题。
    //同步监视器:可以使用任何一个类的对象充当。
    // 但是，多个线程必须共用同一个同步监视器。
    static Object obj = new Object();

    @Override
    public void run() {
        while(true){
         //synchronized (obj){//obj: 使用static修饰以后，就能保证其唯一性。
           synchronized(Window.class){// 结构：Class clz = Window.class，是唯一的。
             //需要被同步的代码
             if(ticket >0){

                 try {
                     Thread.sleep(1000);
                 } catch (InterruptedException e) {
                     throw new RuntimeException(e);
                 }
                 System.out.println(Thread.currentThread().getName()+ "售票，票号为：" + ticket);
                 ticket--;

             }else {
                 break;
             }
         }
        }
    }
}


public class WindowTest {
    public static void main(String[] args) {
        Window w1 = new Window();
        Window w2 = new Window();
        Window w3 = new Window();

        w1.setName("窗口1");
        w2.setName("窗口2");
        w3.setName("窗口3");

        w1.start();
        w2.start();
        w3.start();
    }
}
